/**
 * 观察某个对象的所有属性
 * @param {Object} obj
 */
function observe(obj) {
    for (const key in obj) {
        // 定义一个变量存在改变的对象属性
        let internalVal = obj[key]
        // 定义一个set存唯一的方法集合
        let funcs = new Set()
        Object.defineProperty(obj, key, {
            // 读取器
            get: function () {
                // 依赖收集，记录：是哪个函数在用我
                if (window.__func) {
                    // 如果被调用的方法在window上,就收集在集合中
                    funcs.add(window.__func)
                }
                return internalVal
            },
            // 设置器：数据发生变化时才会触发
            set: function (val) {
                // 派发更新，运行：执行用我的函数
                internalVal = val
                // 循环执行方法集合
                for (const func of funcs) {
                    // 执行方法
                    func()
                }
            }
        })
    }
}
// 自动运行方法 获取值
function autorun(fn) {
    // 将方法存在全局供observe依赖收集
    window.__func = fn
    fn(); // 调用一次
    // 使用完之后置空,防止内存泄漏
    window.__func = null
}


